package br.com.sovi.resources.autenticacao;

import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;

import org.openinsula.arena.tokenauth.Token;
import org.openinsula.arena.tokenauth.TokenAuthenticator;
import org.openinsula.vulcano.core.command.invoker.CommandInvoker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.sovi.persistence.Usuario;
import br.com.sovi.resources.Constants;
import br.com.sovi.resources.usuario.UsuarioVO;

@Component
@Path("/autenticacao")
@Produces(Constants.MEDIA_TYPE_PRODUCES)
public class AutenticacaoResource {

	private final Logger logger = LoggerFactory.getLogger(getClass());

	@Autowired
	private CommandInvoker commandInvoker;

	@Autowired
	private TokenAuthenticator tokenAuthenticator;

	@GET
	@Path("/getUsuarioByCodigoEmpresa")
	public List<UsuarioVO> getByCodigo(@QueryParam("codigo") final String codigo) {
		logger.debug("Buscando usuários de empresa autenticada.");

		Set<Usuario> invoke = commandInvoker.invoke(new GetUsuariosFromEmpresaByCodigo(codigo));

		return UsuarioVO.convertCollection(invoke);
	}

	@POST
	@Path("/efetuarLogin")
	public UsuarioVO efetuarLogin(@FormParam("login") String login, @FormParam("senha") String senha,
			@Context HttpServletResponse response) {
		logger.debug("Efetuando login de: " + login);

		Usuario usuarioEncontrado = commandInvoker.invoke(new EfetuarLoginCommand(login, senha));

		if (usuarioEncontrado != null) {
			final Token token = new Token(login, System.currentTimeMillis());
			final String authenticate = tokenAuthenticator.authenticate(token);
			response.setHeader(TokenAuthenticator.TOKEN_AUTHENTICATOR_HEADER, authenticate);

			return new UsuarioVO(usuarioEncontrado);
		}
		else {
			response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
			return null;
		}
	}

}
